home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
L' Effet Pommier 3
/
L'Effet Pommier - Volume 03.iso
/
Programmation
/
Alpha ƒ
/
Tcl
/
SystemCode
/
eudora.tcl
< prev
next >
Wrap
Text File
|
1996-01-15
|
23KB
|
849 lines
# <nowrap>
# Built for Eudora
# Class message: A message
# Elements:
# field by name
# Properties:
# body string -- the body of the message
# priority integer -- the priority
# label integer -- the index of the label
# status unread/already read/replied/forwarded/redirected/not sendable/sendable/queued/sent/never sent -- the message status
# sender string -- the sender as appearing in the message summary
# date string [r/o] -- the date as appearing in the message summary
# subject string -- the subject as appearing in the message summary
# size integer [r/o] -- the size of the message
# outgoing boolean [r/o] -- is the message is outgoing?
# signature none/standard/alternate -- which signature the message should have
# QP boolean -- is Eudora allowed to encode text?
# return receipt boolean -- is a return receipt is requested?
# wrap boolean -- should the text be wrapped when sent?
# tab expansion boolean -- should tabs get expanded to spaces?
# keep copy boolean -- should a copy should be kept after message is sent?
# preserve macintosh info boolean -- should Macintosh information always be sent with attachments?
# attachment encoding AppleDouble/AppleSingle/BinHex/uuencode -- the type of encoding to use for attachments
# show all headers boolean -- should all headers be visible?
# transliteration table integer -- the resource id of the transliteration table
# will be fetched boolean -- will the message be [re]fetched on next check?
# will be deleted boolean -- will the message be deleted from server on next check?
#
proc mailMenu {} {}
proc dummyMail {} {}
proc showEudoraMenuProc {flag} {
global showEudoraMenu mailMenu
if {$showEudoraMenu} {
insertMenu $mailMenu
} else {
removeMenu $mailMenu
}
}
#===============================================================================
newModeVar Mail tossOnQueue 1 1
newModeVar Mail switchOnQueue 0 1
newModeVar Mail immediateSend 0 1
#===============================================================================
# Utility routines.
proc eudoraFolder {} { nameObject euMF {'TEXT'()} [nullObject] }
proc mailboxByName {name} { nameObject euMB "╥$name╙" [eudoraFolder] }
proc mailboxByIndex {ind} { indexObject euMB $ind [eudoraFolder] }
proc eudoraMessage {msg_id mailbox} { indexObject euMS $msg_id [mailboxByName $mailbox] }
proc mailboxProperty {prop mailbox} { objectProperty 'CSOm' $prop [mailboxByName $mailbox] }
proc messageProperty {prop msg_id mailbox} { objectProperty 'CSOm' $prop [eudoraMessage $msg_id $mailbox] }
# Get path-name for indicated mailbox
proc mailboxPathName {name} {
extractPath [mailboxProperty euFS $name]
}
proc mailboxPathIndex {ind} {
set res [objectProperty 'CSOm' euFS [mailboxByIndex $ind]]
return [extractPath $res]
}
#===============================================================================
proc checkMailPath {} {
global mailPath modifiedVars
return [checkRunning "Mail app:" "CSOm" mailPath]
}
if {![info exists eudoraBoxes]} {
set eudoraBoxes {In Out}
}
menu -n $mailMenu -p eudoraProc {
"<SbackgroundEudora"
"<Seudora"
"help"
"(-"
"/e<UnewMessage"
"cc"
"bcc"
"(-"
"/f<Usend"
"/g<Ureply"
"(-"
"updateMailboxLists"
"/h<UopenMailbox╔"
{menu -n open -p mailBoxProc -m {}}
"(-"
"/i<UmoveToTrash"
"/j<UmoveToMailbox╔"
{menu -n moveTo -p transferProc -m {}}
"(-"
{menu -n tellEudora -p eudoraProc {
"/k<UflushOutbox"
"/l<UcheckForMail"
"(-"
startNotifying
stopNotifying}}
{menu -n mailFlags -p mailFlagsProc {flushOnCheck alertOnIncoming}}
}
menu -n open -p mailBoxProc -m $eudoraBoxes
menu -n moveTo -p transferProc -m $eudoraBoxes
proc openMailbox {} {
global eudoraBoxes eudoraLastFolder modifiedVars
if {[info exists eudoraLastFolder]} {
set fold $eudoraLastFolder
} else {
set fold [lindex $eudoraBoxes 0]
}
set eudoraLastFolder [sPromptChoices "Open mailbox" $fold $eudoraBoxes]
mailBoxProc dummy $eudoraLastFolder
lappend modifiedVars eudoraLastFolder
}
proc moveToFolderProc {curr c} {
global eudoraBoxes
if {$c != "\t"} {return $c}
set matches {}
foreach w $eudoraBoxes {
if {[string match "$curr*" $w]} {
lappend matches $w
}
}
if {![llength $matches]} {
beep
} else {
return [string range [largestPrefix $matches] [string length $curr] end]
}
return ""
}
proc moveToMailbox {} {
global eudoraLastFolder modifiedVars
if {[info exists eudoraLastFolder]} {
set fold $eudoraLastFolder
} else {
set fold Trash
}
set folder [statusPrompt -f "Move to ($fold): " moveToFolderProc]
if {[string length $folder]} {
doFolderMove $folder
set eudoraLastFolder $folder
lappend modifiedVars eudoraLastFolder
} else {
doFolderMove $fold
}
}
proc eudoraProc {menu item} {
global mailPath HOME
global mailMenu
if {![info exists mailPath] || ![file exists $mailPath]} {
alertnote "Please set 'Eudora Path' via menu item\r \"Config:App Paths\"."
return
}
if {![string match {*udora} $item]} {
checkRunning "Eudora" {CSOm} mailPath
}
switch $item {
"eudora" {launch -f $mailPath}
"backgroundEudora" {launch $mailPath}
"help" {edit -r "$HOME:Help:Eudora"}
"cc" {eudoraCc}
"bcc" {eudoraBcc}
"newMessage" {mailNewMsg}
"reply" {mailReplymsg}
"send" {checkMailPath; mailSendCreatedMsg}
"flushOutbox" {checkMailPath; mailFlushOut}
"checkForMail" {checkMailPath; mailCheck}
"startNotifying" "checkMailPath; startNotifying"
"stopNotifying" "checkMailPath; stopNotifying"
"moveToTrash" {mailTrashmsg}
"Create New" {eudoraNewMailbox}
"Delete" {eudoraDeleteMailbox}
default $item
}
}
if {![info exists mailflushOnCheck]} {set mailflushOnCheck 1}
if {![info exists mailalertOnIncoming]} {set mailalertOnIncoming 1}
markMenuItem mailFlags flushOnCheck $mailflushOnCheck
markMenuItem mailFlags alertOnIncoming $mailalertOnIncoming
proc mailFlagsProc {menu flag} {
global mail$flag modifiedVars
set mail$flag [expr 1 - [set mail$flag]]
lappend modifiedVars mail$flag
markMenuItem mailFlags $flag [set mail$flag]
}
# Works, but eudora doesn't immediately flush mailboxes
# proc directMailbox {menu folder} {
# global inboxMembers ALPHA eudoraBoxes modifiedVars
# global tileLeft tileTop tileWidth tileHeight errorHeight
#
# killMailboxWindow
#
# checkMailPath
# switchTo $ALPHA
#
# global trashedMsgs$folder
# set trashedMsgs$folder {}
#
# set res [AEBuild -r 'CSOm' core getd ---- "obj \{form:prop, want:type(prop), seld:type(euFS), from:obj \{form:indx, want:type(euMB), seld:[expr [lsearch $eudoraBoxes $folder] + 1], from:obj \{form:name, want:type(euMF), seld:'TEXT'(), from:'null'()\}\}\}" ]
# if {![regexp {╟(.*)╚} $res dummy fss]} return
# set name [file tail [set fname [specToPathName $fss]]]
# if {$name != $folder} {
# beep
# message "You need to update your mailbox lists."
# return
# }
# message $name
#
# set fd [open $fname]
# set text {}
# set ind 1
# set inboxMembers {}
#
# foreach ln [split [read $fd] "\r\n"] {
# if {[regexp {^From:} $ln dummy]} {
# regexp {[a-zA-Z0-9_.]+@[a-zA-Z0-9_.]+} $ln from
# } elseif {![regexp {^Subject: (.*)} $ln dummy subject]} continue
#
# if {[info exists from] && [info exists subject]} {
#
# set tag {}
# while {[lsearch $inboxMembers $from$tag] >= 0} {
# if {![string length $tag]} {
# set tag { <2>}
# } else {
# regexp {[0-9]+} $tag tag
# set tag " <[expr $tag + 1]>"
# }
# }
#
# append text [format "%-40s : %s\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t░$folder░$ind\r" $from$tag $subject]
# lappend inboxMembers $from$tag
# incr ind
#
# unset from; unset subject
# }
# }
# close $fd
# if {![string length $text]} {
# alertnote "No messages in '$folder'!"
# return
# }
#
# new -n "* MAILBOX '$folder' *" -g $tileLeft $tileTop $tileWidth $errorHeight
# global winModes
# set name [lindex [winNames] 0]
# changeMode [set winModes($name) Brws]
#
# insertText "(<cr> to go to message)\r-----\r$text"
#
# select [nextLineStart [nextLineStart 0]] [nextLineStart [nextLineStart [nextLineStart 0]]]
# setWinInfo dirty 0
# setWinInfo read-only 1
# message ""
# }
proc mailBoxProc {menu item} {
global inboxMembers ALPHA eudoraBoxes modifiedVars
global tileLeft tileTop tileWidth tileHeight errorHeight
killMailboxWindow
checkMailPath
switchTo $ALPHA
global trashedMsgs$item
set trashedMsgs$item {}
set inboxMembers {}
set text {}
set ind 1
foreach msg [mailSenders $item] {
set from [mailAddr [lindex $msg 0]]
set tag {}
while {[lsearch $inboxMembers $from$tag] >= 0} {
if {![string length $tag]} {
set tag { <2>}
} else {
regexp {[0-9]+} $tag tag
set tag " <[expr $tag + 1]>"
}
}
append text [format "%-40s : %s\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t░$item░$ind\r" "$from$tag" [lindex $msg 1]]
lappend inboxMembers $from$tag
incr ind
}
if {![string length $text]} {
alertnote "No messages in '$item'!"
return
}
new -n "* MAILBOX '$item' *" -g $tileLeft $tileTop $tileWidth $errorHeight
global winModes
set name [lindex [winNames] 0]
changeMode [set winModes($name) Brws]
insertText "(<cr> to go to message)\r-----\r$text"
select [nextLineStart [nextLineStart 0]] [nextLineStart [nextLineStart [nextLineStart 0]]]
setWinInfo dirty 0
setWinInfo read-only 1
message ""
}
proc eudoraNewMailbox {} {
}
proc eudoraDeleteMailbox {} {
}
proc killMailboxWindow {} {
if {[set ind [lsearch [winNames] {*MAILBOX*}]] >= 0} {
set win [lindex [winNames] $ind]
bringToFront $win
killWindow
}
}
proc mailGotoMatch {} {
if {[regexp {░(.+)░([0-9]+)} [getText [lineStart [getPos]] [nextLineStart [getPos]]] dummy folder ind]} {
global trashedMsgs$folder
set deleted 0
for {set i 1} {$i < $ind} {incr i} {
if {[lsearch [set trashedMsgs$folder] $i] >= 0} {
incr deleted
}
}
mailOpen $folder [expr $ind - $deleted] $ind
}
}
proc mailAddr {name} {
if {![regexp {<(.*)>} $name dummy addr]} {
regexp {^[^ ]+} $name addr
}
return $addr
}
proc mailSenders {folder} {
set cnt [mailCountMsgs $folder]
set msgs {}
for {set i 1} {$i <= $cnt} {incr i} {
set subject {}
regexp {From: (.*)} [mailGetField from $folder $i] dummy from
regexp {Subject: (.*)} [mailGetField subject $folder $i] dummy subject
lappend msgs [list $from $subject]
}
return $msgs
}
proc eudoraCc {} {
if {![catch {set res [search -s -f 1 -r 1 -i 1 {cc:.*} 0]}]} {
goto [lindex $res 0]
endOfLine
} else {
beginningOfBuffer
nextLine
insertText "Cc: \r"
backwardChar
}
}
proc eudoraBcc {} {
if {![catch {set res [search -s -f 1 -r 1 -i 1 {bcc:.*} 0]}]} {
goto [lindex $res 0]
endOfLine
} else {
beginningOfBuffer
nextLine
insertText "Bcc: \r"
backwardChar
}
}
proc mailFlushOut {} {
global MailmodeVars
message "Telling Eudora to flush messages╔"
AEBuild 'CSOm' CSOm eCon eSen bool(╟01╚) eChk bool(╟00╚)
message ""
}
proc mailCheck {} {
global MailmodeVars mailflushOnCheck
message "Told Eudora to check for new mail╔"
AEBuild 'CSOm' CSOm eCon eSen bool(╟0$mailflushOnCheck╚) eChk bool(╟01╚)
}
proc mailReplymsg {} {
global inboxMembers
set prefix "> "
set res [search -s -f 1 -r 1 {^>==} 0]
set header [getText 0 [lindex $res 0]]
set from [mailGetFrom]
if {![regexp {Subject: ([^\r]*)} $header dummy subject]} {set subject ""}
set body [getText [expr [lindex $res 1] + 1] [maxPos]]
regsub -all "\r" $body "\r$prefix" body
mailNewMsg $from "Re: $subject" "\r$prefix$body\r"
}
proc transferProc {menu item} {
doFolderMove $item
}
proc mailTrashmsg {} {
doFolderMove Trash
}
proc doFolderMove {toFolder} {
# Is this a summary or msg window?
if {[regexp "MAILBOX" [lindex [winNames] 0]]} {
if {![regexp {░(.*)░([0-9]+)} [getText [getPos] [nextLineStart [getPos]]] dummy folder orig]} {
beep
return
}
if {$toFolder == $folder} return
global trashedMsgs$folder
set deleted 0
for {set i 1} {$i < $orig} {incr i} {
if {[lsearch [set trashedMsgs$folder] $i] >= 0} {
incr deleted
}
}
set number [expr $orig - $deleted]
set summary 1
} else {
set pos [lindex [search -f 1 -r 1 {^Msg} 0] 0]
set text [getText $pos [nextLineStart $pos]]
regexp {"([^"]+)" \(([0-9]+)\).*"([^"]+)"} $text dummy number orig folder
if {$toFolder == $folder} return
set summary 0
global trashedMsgs$folder
}
message "Moving msg $number ($orig) of folder '$folder' to '$toFolder'"
moveMsg $number $folder $toFolder
if {!$summary} killWindow
lappend trashedMsgs$folder $orig
# Find summary info and delete it
set win [lindex [winNames] 0]
if {[regexp "MAILBOX" $win]} {
setWinInfo read-only 0
set inds [search -f 1 -r 1 "░$folder░$orig\$" 0]
set pos [lindex $inds 0]
deleteText [lineStart $pos] [nextLineStart $pos]
if {[string length [search -n -f 1 -r 0 {░} 0]]} {
setWinInfo dirty 0
setWinInfo read-only 1
nextLine
upBrowse
} else {
setWinInfo dirty 0
killWindow
}
}
}
proc mailGetFrom {} {
set res [search -s -f 1 -r 1 {>==} 0]
set header [getText 0 [lindex $res 0]]
if {[regexp {From: ([^\r]*)} $header dummy from]} {
return [mailAddr $from]
}
error "No from line"
}
proc mailSendCreatedMsg {} {
global MailmodeVars
set name [checkMailPath]
set res [search -s -f 1 -r 0 {>==text follows this line==<} 0]
set header [getText 0 [lindex $res 0]]
if {![regexp {To: ([^\r]*)} $header dummy to]} {set to ""}
if {![regexp {Cc: ([^\r]*)} $header dummy cc]} {set cc ""}
if {![regexp {Subject: ([^\r]*)} $header dummy subject]} {set subject ""}
set body [getText [expr [lindex $res 1] + 1] [maxPos]]
mailCreateMsg
mailSetField to $to
mailSetField cc $cc
mailSetField subject $subject
mailSetField "" $body
if {$MailmodeVars(tossOnQueue)} {
setWinInfo dirty 0
killWindow
}
mailQueueLast
if {$MailmodeVars(switchOnQueue)} {
switchTo $name
}
if {$MailmodeVars(immediateSend)} {
mailFlushOut
} else {
message "Message queued╔"
}
}
proc mailNewMsg {{to ""} {subject ""} {body ""}} {
new -n "New Mail"
global winModes
set name [lindex [winNames] 0]
changeMode [set winModes($name) Mail]
insertText "To: $to\rSubject: $subject\r>==text follows this line==<\r$body"
setWinInfo dirty 0
goto 0
centerRedraw
mailTab
}
proc mailTab {} {
global mailKeywords
if {[catch {search -s -f 1 -r 1 -i 1 "([join $mailKeywords {|}]|^>)" [getPos]} res]} {
insertText "\t"
return
}
if {[lookAt [lindex $res 0]] == ">"} {
select [nextLineStart [lindex $res 1]] [maxPos]
} else {
goto [expr [lindex $res 1] + 1]
endLineSelect
}
}
bind '\t' mailTab Mail
proc mailOpen {folder i originalNum} {
global tileLeft tileTop tileHeight trashedMsgs$folder
set from [mailGetField From $folder $i]
set to [mailGetField To $folder $i]
set subject [mailGetField Subject $folder $i]
set sender [mailGetField Sender $folder $i]
set cc [mailGetField cc $folder $i]
set contents [mailGetField "" $folder $i]
#===============================================================================
global tileHeight tileWidth tileTop tileLeft errorHeight errorDisp
set top $tileTop
set geo [getGeometry]
if {([lindex $geo 0] != $tileLeft) || ([lindex $geo 1] != $top) || ([lindex $geo 2] != $tileWidth) || ([lindex $geo 3] != $errorHeight) } {
moveWin $tileLeft $top
sizeWin $tileWidth $errorHeight
}
set mar 28
incr top [expr $errorHeight + $mar]
#===============================================================================
new -n "MAIL" -g $tileLeft $top $tileWidth [expr $errorDisp - 5]
global winModes
set name [lindex [winNames] 0]
changeMode [set winModes($name) Mail]
set text {}
if {[string length $subject]} {append text "$subject\r"}
if {[string length $to]} {append text "$to\r"}
if {[string length $from]} {append text "$from\r"}
if {[string length $cc]} {append text "$cc\r"}
if {[string length $sender]} {append text "$sender\r"}
append text "Msg \"$i\" ($originalNum) of mailbox \"$folder\" Reply Trash\r"
insertText "${text}>===============================================================================
$contents
"
goto 0
goto [lindex [search -f 1 -r 1 {^Msg "} 0] 0]
set pos [getPos]
regexp -indices {([0-9]+).*mailbox "(.+)".*(Reply).*(Trash)} [getText $pos [nextLineStart $pos]] dummy num fold rep tra
colorSelectPos [expr $pos + [lindex $num 0]] [expr 1 + $pos + [lindex $num 1]] bold 12
colorSelectPos [expr $pos + [lindex $fold 0]] [expr 1 +$pos + [lindex $fold 1]] bold 12
hyperSelectPos [expr $pos + [lindex $rep 0]] [expr 1 +$pos + [lindex $rep 1]] "mailReplymsg"
hyperSelectPos [expr $pos + [lindex $tra 0]] [expr 1 +$pos + [lindex $tra 1]] "mailTrashmsg"
goto 0
setWinInfo dirty 0
setWinInfo read-only 1
centerRedraw
}
proc colorSelectPos {from to ind ind2} {
insertColorEscape $from $ind
insertColorEscape $to $ind2
}
proc hyperSelectPos {from to text} {
if {$from == $to} {
beep
return
}
insertColorEscape $from 3
insertColorEscape $from 15 $text
insertColorEscape $to 12
insertColorEscape $to 0
}
proc mailFixMenus {} {
global mailMenu
set ins {}
set outs {}
set cnt [mailCountMsgs in]
for {set i 1} {$i <= $cnt} {incr i} {
lappend ins [mailGetField from in $i]
}
menu -n in {}
foreach item $ins {
addMenuItem -l "" in $item
}
set cnt [mailCountMsgs out]
for {set i 1} {$i <= $cnt} {incr i} {
lappend outs [mailGetField from out $i]
}
menu -n out {}
foreach item $outs {
addMenuItem -l "" out $item
}
}
# make message at end of mailbox "out" of mail folder ""
proc mailCreateMsg {} {
createThingAtEnd 'CSOm' [mailboxByName Out] euMS
}
# Move msg w/ specified index between folders, including to Trash.
proc moveMsg {msg infolder outfolder} {
AEBuild -r 'CSOm' core move {----} "obj \{form:indx, want:type(euMS), seld:$msg, from:obj \{form:name, want:type(euMB), seld:╥$infolder╙, from:obj \{form:name, want:type(euMF), seld:'TEXT'(), from:'null'()\}\}\}" {insh} "insl\{kobj:obj \{form:name, want:type(euMB), seld:╥$outfolder╙, from:obj \{form:name, want:type(euMF), seld:'TEXT'(), from:'null'()\}\}, kpos:end \}"
}
# set field "fld" of message 0 to "to"
proc mailSetField {fld to} {
AEBuild -r 'CSOm' core setd {----} "obj \{form:name, want:type(euFd), seld:╥$fld╙, from:obj \{form:indx, want:type(euMS), seld:1, from:'null'()\}\}" data "╥$to╙"
}
proc mailGetField {field folder msg} {
if {[catch {getObjectData 'CSOm' euFd $field [eudoraMessage $msg $folder]} res]} {
return ""
} else {
return $res
}
}
# obj {want:type('prop'), from:obj {form:indx, want:type(euMS), seld:$msg, from:obj {form:name, want:type(euMB), seld:╥$folder╙, from:obj {form:name, want:type(euMF), seld:'TEXT'(), from:'null'()}}}, form:'prop', seld:type('euST')}
proc mailMsgStatus {folder msg} {
if {[catch {AEBuild -r 'CSOm' core getd {----} "obj \{want:type('prop'), from:obj \{form:indx, want:type(euMS), seld:$msg, from:obj \{form:name, want:type(euMB), seld:╥$folder╙, from:obj \{form:name, want:type(euMF), seld:'TEXT'(), from:'null'()\}\}\}, form:'prop', seld:type('euST')\}"} text]} {
return ""
}
set from [string first "╥" $text]
set to [string first "╙" $text]
return [string range $text [expr $from + 1] [expr $to - 1]]
}
proc mailQueueLast {} {
AEBuild -r 'CSOm' CSOm eQue ---- {obj {form:indx, want:type(euMS), seld:1, from:'null'()}}
}
# CSOm\eAtc{'----':obj {form:indx, want:type(euMS), seld:1, from:'null'()}, eDcl:[fss (╟486172643A4465736B746F7020466F6C6465723A62756773╚)]}
proc mailAttachmentDoesntWork {name} {
AEBuild -r 'CSOm' CSOm eAtc ---- {obj {form:indx, want:type(euMS), seld:1, from:'null'()}} eDcl [makeAlis $name]
}
# core\setd{'----':obj {form:prop, want:type(prop), seld:type(euPY), from:obj {form:indx, want:type(euMS), seld:1, from:'null'()}}, data:1}
proc mailSetNumberProperty {prop to} {
AEBuild -r 'CSOm' core setd ---- "obj \{form:prop, want:type(prop), seld:type($prop), from:obj \{form:indx, want:type(euMS), seld:1, from:'null'()\}\}" data $to
}
proc mailCountMsgs {mbox} {
return [countObjects 'CSOm' [mailboxByName "$mbox"] euMS]
}
proc mailCountMailboxes {} {
return [countObjects 'CSOm' [eudoraFolder] euMB]
}
proc updateMailboxLists {} {
set num [mailCountMailboxes]
for {set i 1} {$i <= $num} {incr i} {
set name [file tail [mailboxPathIndex $i]]
message $name
lappend boxes $name
}
global eudoraBoxes modifiedVars
lappend modifiedVars eudoraBoxes
set eudoraBoxes $boxes
menu -n open -p mailBoxProc -m $eudoraBoxes
menu -n moveTo -p transferProc -m $eudoraBoxes
message "done."
}
#===============================================================================
eventHandler CSOm eNot "eudoraHandler"
# a sample 'msgs': obj {want:type(euMS), from:obj {want:type(euMB), from:obj {want:type(euMF), from:'null'(), form:name, seld:'TEXT'()}, form:name, seld:╥In╙}, form:indx, seld:18}, obj {want:type(euMS), from:obj {want:type(euMB), from:obj {want:type(euMF), from:'null'(), form:name, seld:'TEXT'()}, form:name, seld:╥In╙}, form:indx, seld:19}
proc eudoraHandler {it} {
global blah mailalertOnIncoming
message ""
if {[regexp {eWHp:wArv.*\[(obj.*)\], &repq} $it dum1 msgs]} {
set ids [getMsgIDs $msgs]
if {$mailalertOnIncoming} {
mailBrowser In $ids
beep; beep
}
}
}
proc mailBrowser {folder ids} {
global inboxMembers ALPHA
global tileLeft tileTop tileWidth tileHeight errorHeight
checkMailPath
switchTo $ALPHA
global trashedMsgs$folder
set trashedMsgs$folder {}
set inboxMembers {}
set text {}
foreach id $ids {
regexp {From: (.*)} [mailGetField from $folder $id] dummy from
set from [mailAddr $from]
set subject {}
regexp {Subject: (.*)} [mailGetField subject $folder $id] dummy subject
set tag {}
while {[lsearch $inboxMembers $from$tag] >= 0} {
if {![string length $tag]} {
set tag { <2>}
} else {
regexp {[0-9]+} $tag tag
set tag " <[expr $tag + 1]>"
}
}
append text [format "%-40s : %s\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t░In░$id\r" "$from$tag" $subject]
lappend inboxMembers $from$tag
}
if {![string length $text]} {
alertnote "No messages!"
return
}
if {[set ind [lsearch [winNames] "*Incoming MAILBOX*"]] >= 0} {
bringToFront [lindex [winNames] $ind]
setWinInfo read-only 0
endOfBuffer
insertText $text
} else {
killMailboxWindow
new -n "* Incoming MAILBOX *" -g $tileLeft $tileTop $tileWidth $errorHeight
global winModes
set name [lindex [winNames] 0]
changeMode [set winModes($name) Brws]
insertText "(<cr> to go to message)\r-----\r$text"
}
select [nextLineStart [nextLineStart 0]] [nextLineStart [nextLineStart [nextLineStart 0]]]
setWinInfo dirty 0
setWinInfo read-only 1
message ""
}
proc getMsgIDs {text} {
if {[regexp -indices {seld:([0-9]+)} $text dummy ind]} {
return [concat [string range $text [lindex $ind 0] [lindex $ind 1]] [getMsgIDs [string range $text [lindex $ind 1] end]]]
}
}
proc startNotifying {} {
global HOME ALPHA quitHooks
AEBuild 'CSOm' CSOm nIns ---- [makeAlis "$HOME:$ALPHA"]
# lappend quitHooks stopNotifying
}
proc stopNotifying {} {
global HOME ALPHA
AEBuild 'CSOm' CSOm nRem ---- [makeAlis "$HOME:$ALPHA"]
}